package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.dao.RoleDao;
import com.itheima.dao.UserDao;
import com.itheima.pojo.Role;
import com.itheima.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 角色相关数据
 */
@Service(interfaceClass = RoleService.class)
@Transactional
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    @Autowired
    private UserDao userDao;

    /**
     * 新增角色组,同时要让角色组与添加权限组关联
     * @param role
     * @param permissionIds
     */
    @Override
    public void add(Role role, Integer[] permissionIds) {
        //调用roleDao的add方法,新增角色组(操作Role表)
        roleDao.add(role);
        //设置当前角色组和添加权限组多对多的关系
        Integer roleId = role.getId();
        this.setRoleAndPermission(roleId,permissionIds);
    }



    /**
     * 查询所有角色
     * @return
     */
    @Override
    public List<Role> findAll() {
        return roleDao.findAll();
    }



    /**
     * 编辑角色管理的相关信息,同时需要关联添加权限组的信息(就是添加权限)
     * @param role n
     * @param permissionIds
     */
    @Override
    public void edit(Role role, Integer[] permissionIds) {
        //修改角色管理组的相关信息(Role表中)
        roleDao.edit(role);
        //清理当前角色组关联的添加权限组的关联关系,操作中间关系表t_role_permission表
        roleDao.deleteAssocication(role.getId());
        //重新建立当前角色组和添加权限组的关系
        Integer roleId = role.getId();
        this.setRoleAndPermission(roleId,permissionIds);
    }



    /**
     * 建立当前角色组和添加权限组的关系
     * @param roleId
     * @param permissionIds
     */
    public void setRoleAndPermission(Integer roleId, Integer[] permissionIds ){
        //判断权限id是否不为空以及权限id的长度是否大于0
        if(permissionIds != null && permissionIds.length > 0 ){
            for (Integer permissionId : permissionIds) {
                Map<String,Integer> map = new HashMap<String,Integer>();
                map.put("roleid",roleId);
                map.put("permissionids",permissionId);
                roleDao.setRoleAndPermission(map);
            }
        }
    }


    //查询所有角色
    @Override
    public List<Role> findAllRole() {
        List<Role> allRole = roleDao.findAllRole();
        return allRole;
    }

    //通过uid查询所有的rid
    @Override
    public List<Integer> findRoleIdsByUid(Integer id) {
        return roleDao.findRoleIdsByUid(id);
    }

    //编辑用户与角色关系
    @Override
    public void editUserIdAndRoleId(Integer[] roleIds, Integer id) {
        //先通过id删除中间表,再添加中间表关系
        userDao.deleteUseridAndRoleid(id);
        if (roleIds!=null && roleIds.length>0){
            for (Integer roleId : roleIds) {
                Map<String,Integer> map=new HashMap<String, Integer>();
                map.put("user_id",id);
                map.put("role_id",roleId);
                roleDao.addUserIdAndRoleId(map);
            }
        }

    }


    /**
     *  删除角色
     * @param roleId
     */
    @Override
    public void delete(Integer roleId) {
        roleDao.deleteAssocication(roleId);
        roleDao.deleteById(roleId);
    }

    /**
     * 通过角色id查找所有权限id
     * @param roleId
     * @return
     */
    @Override
    public List<Integer> findPermissionIdsByRoleId(Integer roleId) {
        return roleDao.findPermissionIdsByRoleId(roleId);
    }
}
